package com.learn.criminalintent

import android.app.Activity
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.graphics.Point
import android.media.ExifInterface
import android.util.Log

/**
 * 获取缩放后的Bitmap图片
 *
 * @param path 图片文件的路径
 * @param activity Activity对象，用于获取屏幕尺寸
 * @return 根据屏幕尺寸缩放后的Bitmap对象
 */
fun getScaledBitmap(path: String, activity: Activity): Bitmap {
    // 获取屏幕尺寸
    val size = Point()
    Log.d("PictureUtils", "getScaledBitmap: ${size.x}, ${size.y}")
    activity.windowManager.defaultDisplay.getSize(size)

    // 调用重载方法，根据屏幕宽高进行图片缩放
    return getScaledBitmap(path, size.x, size.y)
}

/**
 * 根据指定的目标宽度和高度，获取缩放后的Bitmap图片
 * @param path 图片文件的路径
 * @param destWidth 目标宽度
 * @param destHeight 目标高度
 * @return 缩放后的Bitmap对象
 */
fun getScaledBitmap(path: String, destWidth: Int, destHeight: Int): Bitmap {
    // 第一次解码，只获取图片的原始尺寸信息，不加载图片到内存
    var options = BitmapFactory.Options()
    options.inJustDecodeBounds = true
    BitmapFactory.decodeFile(path, options)

    // 计算图片的缩放比例
    val srcWidth = options.outWidth.toFloat()
    val srcHeight = options.outHeight.toFloat()

    var inSampleSize = 1
    if (srcHeight > destHeight || srcWidth > destWidth) {
        val heightScale = srcHeight / destHeight
        val widthScale = srcWidth / destWidth
        // 适应模式: 会选择较大的缩放比例，确保图片能完整显示在目标区域内
        val sampleScale = if (heightScale > widthScale) heightScale else widthScale
        // 填充模式: 选择较小的缩放比例，确保图片在某个维度上完全填满目标区域
//        val sampleScale = if (heightScale < widthScale) heightScale else widthScale
        inSampleSize = Math.round(sampleScale)
    }

    // 第二次解码
    options = BitmapFactory.Options()
    options.inSampleSize = inSampleSize
    val bitmap = BitmapFactory.decodeFile(path, options)
        ?: return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)

    // 统一使用旋转工具
    return rotateBitmapIfNeeded(bitmap, path)
}


/**
 * 根据 EXIF 信息旋转 Bitmap
 */
fun rotateBitmapIfNeeded(bitmap: Bitmap, path: String): Bitmap {
    val exif = ExifInterface(path)
    val orientation = exif.getAttributeInt(
        ExifInterface.TAG_ORIENTATION,
        ExifInterface.ORIENTATION_NORMAL
    )

    val matrix = Matrix()
    when (orientation) {
        ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f)
        ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f)
        ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f)
        // 其他方向不动
    }

    return if (!matrix.isIdentity) {
        Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
    } else {
        bitmap
    }
}

/**
 * 获取原始尺寸但方向正确的 Bitmap
 */
fun getCorrectlyOrientedBitmap(photoPath: String): Bitmap {
    val bitmap = BitmapFactory.decodeFile(photoPath)
        ?: return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
    return rotateBitmapIfNeeded(bitmap, photoPath)
}